package com.github.kaelthasbmg.bean;

import com.github.kaelthasbmg.utils.StringUtil;

/**
 * 列定义
 *
 * @author Carsymor
 */
public class Column {

    /**
     * 表名
     */
    private String tableName;

    /**
     * 列名
     */
    private String columnName;

    /**
     * 列数据类型
     */
    private String columnType;

    /**
     * 列顺序
     */
    private int columnOrder;

    /**
     * 最大长度
     */
    private Integer maxLength;

    /**
     * 精度
     */
    private Integer precision;

    /**
     * 是否允许为空
     */
    private boolean nullAble;

    /**
     * 默认值定义
     */
    private String defaultDefine;

    public String getTableName() {
        return tableName;
    }

    public void setTableName(String tableName) {
        this.tableName = tableName;
    }

    public String getColumnName() {
        return columnName;
    }

    public void setColumnName(String columnName) {
        this.columnName = columnName;
    }

    public String getColumnType() {
        return columnType;
    }

    public void setColumnType(String columnType) {
        this.columnType = columnType;
    }

    public int getColumnOrder() {
        return columnOrder;
    }

    public void setColumnOrder(int columnOrder) {
        this.columnOrder = columnOrder;
    }

    public Integer getMaxLength() {
        return maxLength;
    }

    public void setMaxLength(Integer maxLength) {
        this.maxLength = maxLength;
    }

    public Integer getPrecision() {
        return precision;
    }

    public void setPrecision(Integer precision) {
        this.precision = precision;
    }

    public boolean isNullAble() {
        return nullAble;
    }

    public void setNullAble(boolean nullAble) {
        this.nullAble = nullAble;
    }

    public String getDefaultDefine() {
        if (this.defaultDefine != null && this.isStringType()) {
            return "'" + this.defaultDefine + "'";
        }
        return this.defaultDefine;
    }

    /**
     * 判断字段定义是否为字符串类型
     * @return 若字段定义为字符串类型，则返回true
     */
    private boolean isStringType() {
        if (StringUtil.isBlank(this.columnType)) {
            return false;
        }

        return this.columnType.toLowerCase().indexOf("text") != -1 || this.columnType.toLowerCase().indexOf("char") != -1;
    }

    public void setDefaultDefine(String defaultDefine) {
        this.defaultDefine = defaultDefine;
    }

    /**
     * 字段数据类型是否有长度属性
     * @return 若字段数据类型有长度属性，则返回true
     */
    public boolean hasMaxLength() {
        return this.maxLength != null;
    }

    /**
     * 字段数据类型是否有精度属性
     * @return 若字段数据类型有精度属性，则返回true
     */
    public boolean hasPrecision() {
        return this.precision != null;
    }

    /**
     * 字段是否有默认值配置
     * @return 若字段有默认值配置，则返回true
     */
    public boolean hasDefault() {
        return !StringUtil.isBlank(this.defaultDefine);
    }

    /**
     * 判断字段的数据类型是否不为text
     * @return 若字段的数据类型不为text，则返回true
     */
    public boolean notTextType() {
        if (StringUtil.isBlank(this.columnType)) {
            return true;
        }

        return this.columnType.toLowerCase().indexOf("text") == -1;
    }

    /**
     * 判断字段的数据类型是否为text
     * @return 若字段的数据类型为text，则返回true
     */
    public boolean isTextType() {
        return !StringUtil.isBlank(this.columnType) && this.columnType.toLowerCase().indexOf("text") != -1;
    }

    /**
     * 判断字段的数据类型是否不为int
     * @return 若字段的数据类型不为int，则返回true
     */
    public boolean notIntType() {
        if (StringUtil.isBlank(this.columnType)) {
            return true;
        }

        return this.columnType.toLowerCase().indexOf("int") == -1;
    }

    /**
     * 判断字段的数据类型是否为datetime
     * @return 若字段的数据类型为datetime，则返回true
     */
    public boolean isDateTimeType() {
        if (StringUtil.isBlank(this.columnType)) {
            return false;
        }

        return this.columnType.equalsIgnoreCase("datetime");
    }
}
